package commonClass;

/**
 * 字符串特性
 */
public class StringExercise02 {

    public static void main(String[] args) {

        /*
            1)String是一个final类，代表不可变的字符序列
            2)字符串是不可变的。一个字符串对象一旦被分配，其内容是不可变的
         */
        //以下语句创建了几个对象？2个
        String s1 = "hello";
        s1 = "haha";

        //只创建了1个对象
        String s = "hello" + "abc";
        /*
            优化等价：String s = "helloabc";
            编译器会做一个优化，判断创建的常量池对象是否有引用指向
         */

        //创建了3个对象
        String a = "hello"; //创建a对象
        String b = "abc";   //创建b对象
        String c = a + b;
        /*
            底层是 StringBuilder sb = new StringBuilder();
                  sb.append(a);
                  sb.append(b);
                  sb是在堆中，且append是在原来字符串的基础上追加的
            重要规则：String c1 = "ab" + "cd"，常量相加看的是池
                     String c1 = a + b，变量相加，是在堆中
         */

        String ss1 = "lmy"; //ss1指向池中 "lmy"
        String ss2 = "java";//ss2指向池中 "java"
        String ss5 = "lmyjava";//ss5指向池中 "lmyjava"
        String ss6 = (ss1 + ss2).intern();  //ss6指向池中"lmyjava"
        System.out.println(ss5 == ss6);//T
        System.out.println(ss5.equals(ss6));//T
    }
}
